table of contents
SIGACTION(2) | Linux - příručka programátora | SIGACTION(2) |
JMÉNO¶
sigaction - prověří a změní akci signálu
SYNTAXE¶
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
Vyžaduje Feature Test Makro pro glibc (viz
feature_test_macros(7)):
sigaction(): _POSIX_C_SOURCE>=1 || _XOPEN_SOURCE || _POSIX_SOURCE
POPIS¶
Systémovým voláním sigaction se určuje, jakou akci má proces provést při obdržení určitého signálu.
Parametrem signum je určen signál a lze zadat kterýkoli platný signál kromě SIGKILL a SIGSTOP.
Je-li hodnota act nenulová, je pro signál signum nainstalovaná akce act. Je-li hodnota oldact nenulová, předchozí akce je uložena do oldact.
Struktura sigaction je definována jako
struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void); }
Na některých architekturách je zahrnuto sjednocení: nepřiřazujte do sa_handler a sa_sigaction.
Prvek sa_restorer je zastaralý a neměl by být používán. Norma POSIX nespecifikuje prvek sa_restorer.
sa_handler určuje akci, která má být přiřazena signálu signum a může obsahovat SIG_DFL pro implicitní akci, SIG_IGN pro ignorování signálu, nebo ukazatel na funkci ošetřující signál. Tato funkce má ošetřující funkci jako jediný parametr.
Pokud je v sa_flags specifikováno SA_SIGINFO, pak je obslužná funkce pro signum specifikována v sa_sigaction a ne v sa_handler. Tato funkce obdrží číslo signálu jako první parametr, ukazatel na siginfo_t jako druhý parametr a ukazatel na ucontext_t jako poslední třetí parametr. sa
sa_mask je maska signálů, které mají být zablokovány při obsluze signálu. Navíc je zablokován signál, který vyvolal akci, nejsou-li nastaveny příznaky SA_NODEFER .
sa_flags je množina příznaků, které ovlivňují obsluhu signálu. Je to logický součet následujících bitových konstant:
- SA_NOCLDSTOP
- Je-li signum SIGCHLD, negeneruje se signál při zastavení dětského procesu (tj. dostane-li tento proces signál SIGSTOP, SIGTSTP, SIGTTIN nebo SIGTTOU) nebo při ukončení (tj. při obdržení SIGCONT) (viz wait(2)). Toto nastavení má smysl pouze při zřízení obslužné funkce pro SIGCHLD.
- SA_NOCLDWAIT (Od Linuxu 2.6)
- Je-li signum rovno IGCHLD, nejsou z potomci procesu
poté co skončí transformovány na zombie.
Další informace také waitpid(2).
Tento příznak má smysl pouze když je
nastavena obslužná funkce pro SIGCHLD nebo je
nastaveno SIG_DFL.
Je-li příznak SA_NOCLDWAIT nastaven během zřizování obslužné funkce pro SIGCHLD, pak norma POSIX.1 nespecifikuje zda je signál SIGCHLD generován při ukončení potomka procesu. Na Linuxu je signál SIGCHLD v takovémto případě generován. V některých jiných implementacích však signál generován není.
- SA_NODEFER
- Umožní příchod dalšího signálu během jeho vlastní obslužné funkce. Má smysl pouze pokud je nastavena obslužná funkce. SA_NOMASK je zastaralé a nestandardní synonymum.
- SA_ONSTACK
- Zavolá obslužnou funkci na alternativním signálovém zásobníku poskytnutého prostřednictvím sigaltstack(2). Pokud není alternativní zásobník dostupný, bude použit implicitní z zásobník. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce.
- SA_RESETHAND
- Poté, co je zavolána obslužná funkce, se obsluha signálu vrací do implicitního stavu. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce. SA_ONESHOT je zastaralé a nestandardní synonymum.
- SA_RESTART
- Nastaví kompatibilní chování s BSD: určitá systémová volání pak jsou po zpracování signálu restartována. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce. Pro více informací o restartu systémového volání se obraťte na signal(7).
- SA_SIGINFO (Od Linuxu 2.2)
- Obslužná funkce má tři parametry, ne jeden. V tomto případě sa_sigaction by mělo být nastaveno místo sa_handler. Toto nastavení je smysluplné pouze v případě, že je nastavena obslužná funkce.
Parametr siginfo_t pro sa_sigaction je struktura s následujícími prvky:
siginfo_t {
int si_signo; /*číslo signálu*/
int si_errno; /*hodnota errno*/
int si_code; /*kód signálu*/
int si_trapno; /*číslo, které zapříčinilo hard-
warově generovaný signál (nepo-
užito na většině architektur)*/
pid_t si_pid; /*ID odesílajícího procesu*/
uid_t si_uid; /*skutečné ID vlastníka*/
int si_status; /*návratová hodnota signálu*/
clock_t si_utime; /*spotřeba uživatelského času*/
clock_t si_stime; /*spotřeba systémového času*/
sigval_t si_value; /*hodnota signálu*/
int si_int; /*POSIX.1b signál*/
void *si_ptr; /*POSIX.1b signál*/
int si_overrun; /*počítadlo časovače*/
int si_timerid; /*ID časovače POSIX.1b*/
void *si_addr; /*paměťová lokace, která
způsobila chybu*/
int si_band; /*band event*/
int si_fd; /*identifikátor souboru*/ }
Proměnné si_signo, si_errno a si_code jsou definována pro všechny signály. (si_errno se na Linuxu většinou nepoužívá) Zbytek struktury může být union, takže by měla být čtena pouze pole, která mají význam pro daný signál:
* POSIX.1b signály a SIGCHLD nastavují si_pid a si_uid.
* POSIX.1b časovače (od Linux verze 2.6)
nastavují si_overrun
a si_timerid. Pole si_timerid je interní ID
použité
kernelem pro identifikaci časovače. Není to
stejné číslo
jako ID vracené funkcí timer_create(2).
* SIGCHLD použije si_status, si_utime a si_stime.
* Proměnné si_int a si_ptr jsou
specifikována odesilatelem
POSIX.1b signálu. Více detailů lze nalézt v
sigqueue(2).
* SIGILL, SIGFPE, SIGSEGV a SIGBUS
používají si_addr kam
vloží adresu chyby. SIGPOLL používá
si_band a si_fd.
si_code je hodnota (ne bitová maska) indikující který signál byl zaslán. Následující seznam ukazuje hodnoty, které mohou být umístěny v poli si_code společně s důvodem, proč byl signál generován.
- SI_USER kill(2) nebo raise(3)
- SI_KERNEL Signály zaslané kernelem.
- SI_QUEUE sigqueue(2)
- SI_TIMER vypršel POSIXový časovač
- SI_MESGQ změnil se stav POSIXové fronty zpráv
-
(Od Linuxu 2.6.6). Viz. mq_notify(3) - SI_ASINCIO Dokončeno AIO.
- SI_SIGIO SIGIO zařazeno do fronty
- SI_TKILL tkill(2) nebo tgkill(2) (od Linuxu 2.4.19)
Následující hodnoty mohou být umístěny v si_code pro signál SIGILL:
Následující hodnoty mohou být umístěny v si_code pro signál SIGFPE:
Následující hodnoty mohou být umístěny v si_code pro signál SIGSEGV:
Následující hodnoty mohou být umístěny v si_code pro signál SIGBUS:
Následující hodnoty mohou být umístěny v si_code pro signál SIGTRAP:
Následující hodnoty mohou být umístěny v si_code pro signál SIGCHLD:
Následující hodnoty mohou být umístěny v si_code pro signál SIGPOLL:
NÁVRATOVÁ HODNOTA¶
sigaction() vrací 0 při úspěchu a -1 při chybě.
CHYBY¶
SPLŇUJE STANDARDY¶
POSIX.1-2004, SVr4.
POZNÁMKY¶
Podle normy POSIX je chování procesu nedefinované pokud ignoruje SIGFPE, SIGILL nebo SIGSEGV signály, které nebyly generované pomocí kill(2) nebo raise(3). Dělení nulou v pevné řádové čárce (integer) má nedefinovaný výsledek. Tato operace může na některých architekturách generovat SIGFPE signál. (Také dělení nejmenšího záporného čísla -1 může generovat SIGFPE. ) Ignorování tohoto signálu může skončit nekonečnou smyčkou.
POSIX.1-1990 neumožňovalo nastavení SIGCHLD na hodnotu SIG_IGN. POSIX.1-2001 toto nastavení umožňuje, takže ignorování SIGCHLD může být použito pro zamezení vytváření zombies (viz wait(2)). Nicméně starší BSD a System V aplikace se v chování na příkaz SIGCHLD liší a tak stále jediným přenositelným řešením, že se potomek nestane zombie, je odchytávání signálu SIGCHLD pomocí wait(2) nebo jiné podobné funkce.
Norma POSIX.1-1990 specifikovala pouze SA_NOCLDSTOP. Norma POSIX.1-2001 přidala SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER a SA_SIGINFO. Použití těchto hodnot v sa_flags může být hůře přenositelné na starší linuxové distribuce.
Příznak SA_RESETHAND je kompatibilní se stejnojmenným příznakem v systémech SVr4.
Příznak SA_NODEFER je kompatibilní se stejnojmenným příznakem v SVr4 ve verzích jádra 1.3.9 a vyšších. Ve starších verzích jádra linuxová implementace dovolovala přijetí libovolného signálu, nejen toho který byl instalován (což způsobovalo ignorování nastavení sa_mask ).
Pokud je funkce sigaction() volána s druhým argumentem rovným null, může být zjištěna aktuální obslužná funkce. Může být také zjištěno zda je daný signál podporován na na daném stroji pokud zavoláme tuto funkci s druhým a třetím argumentem rovným null.
Signály SIGKILL a SIGSTOP nemohou být blokovány (specifikováním v sa_mask). Takovéto pokusy budou ignorovány bez vypsání chyby.
Pro více informací o manipulaci s množinami signálů se obraťte na sigsetopts(3).
Pro seznam asynchronních signálově bezpečných funkcí, které mohou být bezpečně volány zevnitř obslužné funkce použijte signal(7).
Nezdokumentované
Před uvedením SA_SIGINFO bylo možné
získat dodatečné informace pomocí funkce
sa_handler s druhým parametrem typu struct sigcontext.
Pro více informací se obraťte na relevantní
kernelové zdroje. Tato funkce je nyní již
zastaralá.
CHYBY¶
V kenelech do verze 2.6.13 včetně, specifikace SA_NODEFER v sa_flags zabránila nejenom vymaskování signálu během provádění obslužné funkce, ale měla také účinek na signály specifikované v sa_mask. Tato chyba byla odstraněna v kernelu 2.6.14.
PŘÍKLAD¶
Viz mprotect(2).
DALŠÍ INFORMACE¶
kill(1), kill(2), killpg(2), pause(2), sigaltstack(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2), wait(2), raise(3), siginterupt(3) , sigsetopts(3), sigvec(3), core(5), signal(7)
TIRÁŽ¶
Tato stránka je součástí projektu Linux man-pages. Popis projektu a informace o hlášení chyb najdete na http://www.kernel.org/doc/man-pages/.
29.října 2009 | Linux 1.3 |